package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 15:06
 **/
public class Stop_RunningThread {
    public static void main(String[] args) throws InterruptedException {
        /**
         * 如何停止一个正在运行的线程？
         * 1、使用退出标志，
         * ===> 使线程正常退出，也就是当run方法完成后线程终止。
         *
         * 2、使用stop方法强行终止，
         * 但是不推荐这个方法，因为stop和suspend及resume一样都是过期作废的方法。
         *
         * 3、使用interrupt方法中断线程。
         */
        MyThread m1 = new MyThread();
        System.out.println("Starting thread...");
        m1.start();
        Thread.sleep(3000);
        System.out.println("Interrupt thread...: " + m1.getName());
        // 设置共享变量为true
        m1.stop = true;
        Thread.sleep(1000);
        // 阻塞时退出阻塞状态
        m1.interrupt();
        // 主线程休眠3秒以便观察线程m1的中断情况
        Thread.sleep(3000);
        System.out.println("Stopping application...");

    }
    static class MyThread extends Thread {
        volatile boolean stop = false;
        public void run() {
            while (!stop) {
                System.out.println(getName() + " is running");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("week up from blcok...");
                    stop = true; // 在异常处理代码中修改共享变量的状态
                }
            }
            System.out.println(getName() + " is exiting...");
        }
    }
}
